import Http from './libs/http/index' // request 源码
import config from '@/config/index' // 配置文件

import Utils from '@/utils'
import * as UniUtils from '@/utils/uni'

const format = Utils.format
const msg = UniUtils.msg

const Axios = new Http()

// 添加基础信息到 Axios 下 ， 用于接口获取路径
Axios.path = config.path

// 全局配置
Axios.setConfig({ url: config.baseApi })

// 全局拦截器
Axios.addGlobalIntercept({
  /*
   *  请求拦截器 (例如配置token)
   *  return false 不请求
   */
  request(reqConfig) {
    reqConfig.header.contentType = 'application/x-www-form-urlencoded'
    return reqConfig
  },

  /*
   *  响应拦截器 (例如根据状态码拦截数据)
   *  return false或者不return值 则都不会返回值
   *  return Promise.reject('xxxxx')，主动抛出错误
   */
  response(res) {
    const resData = format(res, 'data', res)

    tokenTimeOut(resData) // 拦截 token 过期做相应处理

    const SUCCESS_STATUS_CODE = 200
    const SUCCESS_CODE = 0

    /**
     * 成功状态
     * http 状态 200 且 后台返回的结果正常 ( code 为 0 或者 code 不存在 )
     */
    if (format(res, 'statusCode') === SUCCESS_STATUS_CODE && format(resData, 'code', SUCCESS_CODE) === SUCCESS_CODE) {
      return resData
    }

    errMsg(resData)

    return Promise.reject(resData)
  }
})

// 拦截 token 过期做相应处理
function tokenTimeOut(resData) {
  const USER_TOKEN_TIME_OUT = 3
  if (format(resData, 'code') === USER_TOKEN_TIME_OUT) {
    console.log('>>>>> token 过期 <<<<<')
    if (UniUtils.currentPageIn('/login/login')) return
    UniUtils.open('/login/login')
  }
}

/**
 * 错误处理
 * 处理原则： 
 * 1. 如果后台返回了的 code 表示的状态为非成功状态且 携带了 msg 内容，主动弹框显示该错误
 * 2. 如果后台状态异常但没有返回 msg 内容，本方法不抛出提示 ，错误由捕获到该异常的上下文进行判断是否弹框以及弹框内容
 */ 
function errMsg(resData) {
  console.log('response err', resData)
  const msgText = format(resData, 'msg')
  if (!msgText) return
  msg('text', msgText)
}

export default Axios
